/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package LogicaNegocio.Controlador;

import AccesoDatos.Persistencia.Manager.ManagerItemPedido;
import AccesoDatos.Persistencia.Manager.ManagerPedido;
import GUI.Bibliotecario.AdminPedidos.PanelRegistrarPedidos;
import LogicaNegocio.Biblioteca.ItemPedido;
import LogicaNegocio.Biblioteca.Pedido;
import LogicaNegocio.Validacion.VBiblioteca;
import MainBiblioSoft.BiblioSoft;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.persistence.EntityExistsException;
import javax.persistence.RollbackException;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;

/**
 * Esta clase en java permite el control de eventos
 * para registrar los pedidos.
 *
 * @author sebaxtian
 * Archivo: ControlRegistrarPedido.java
 * @version 1.0
 * Fecha: mar jun  8 20:02:20 COT 2010
 */


public class ControlRegistrarPedido {

    //Atributos de clase.
    private PanelRegistrarPedidos panelRegistrarPedidos;
    private ManagerItemPedido gestoItemPedido;
    private ManagerPedido gestorPedido;
    private List<ItemPedido> listaItems;


    public ControlRegistrarPedido(PanelRegistrarPedidos panelRegistrarPedidos) {
        this.panelRegistrarPedidos = panelRegistrarPedidos;
        this.panelRegistrarPedidos.textFieldCeduaBibliotecario.setText(BiblioSoft.bibliotecario.getCedula()+"");
        gestoItemPedido = new ManagerItemPedido();
        gestorPedido = new ManagerPedido();
        listaItems = new ArrayList<ItemPedido>();
    }

    public void agregarItem() {
        Long isbn;
        int cantidad;
        int numeroPedido;
        ItemPedido item;
        try{
            panelRegistrarPedidos.textFieldNumPedido.setEditable(false);
            isbn = Long.parseLong(panelRegistrarPedidos.textFieldISBN.getText());
            cantidad = Integer.parseInt(panelRegistrarPedidos.textFieldCantidad.getText());
            numeroPedido = Integer.parseInt(panelRegistrarPedidos.textFieldNumPedido.getText());
            item = new ItemPedido();
            item.setCantidad(cantidad);
            item.setIsbnPedido(isbn);
            item.setNumeroPedido(numeroPedido);
            if(!buscarItemsISBN(isbn)){
                agregarItemATabla(item);
                listaItems.add(item);
            }else{
                JOptionPane.showMessageDialog(panelRegistrarPedidos, "En la lista de items ya existe un item con ISBN "+isbn, "Pedido", JOptionPane.INFORMATION_MESSAGE);
            }
        }catch(NumberFormatException ex) {
            JOptionPane.showMessageDialog(panelRegistrarPedidos, "El ISBN, cantidad y numero de pedido deben ser valores enteros", "Pedido", JOptionPane.INFORMATION_MESSAGE);
        }
    }

    private void agregarItemATabla(ItemPedido item) {
        //crea una fila
        DefaultTableModel tmp = (DefaultTableModel)panelRegistrarPedidos.tablaItems.getModel();
        Object tupla[] = {"",""};
        tmp.addRow(tupla);
        panelRegistrarPedidos.tablaItems.setValueAt(item.getIsbnPedido(), tmp.getRowCount()-1, 0);
        panelRegistrarPedidos.tablaItems.setValueAt(item.getCantidad(), tmp.getRowCount()-1, 1);
    }

    private boolean buscarItemsISBN(Long isbn) {
        for(int i = 0; i < listaItems.size(); i++){
            if(listaItems.get(i).getIsbnPedido().equals(isbn)){
                return true;
            }
        }
        return false;
    }

    public void quitarItem() {
        int fila = panelRegistrarPedidos.tablaItems.getSelectedRow();
        if(fila != -1){
            DefaultTableModel tmp = (DefaultTableModel)panelRegistrarPedidos.tablaItems.getModel();
            tmp.removeRow(fila);
            listaItems.remove(fila);
        }
    }

    public void limpiarItems() {
        for(int i = 0; i < panelRegistrarPedidos.tablaItems.getRowCount(); i++){
            DefaultTableModel tmp = (DefaultTableModel)panelRegistrarPedidos.tablaItems.getModel();
            tmp.removeRow(i);
            if(tmp.getRowCount()>0){
                limpiarItems();
            }
        }
        listaItems.clear();
    }

    public void registrarPedido() {
        int numeroPedido = -1;
        try {
            numeroPedido = Integer.parseInt(panelRegistrarPedidos.textFieldNumPedido.getText());
            int cedulaBibliotecario = BiblioSoft.bibliotecario.getCedula();
            Date fecha = Calendar.getInstance().getTime();
            boolean comprado = false;
            Pedido pedido = new Pedido();
            pedido.setCedulaBibliotecario(cedulaBibliotecario);
            pedido.setComprado(comprado);
            pedido.setFechaRealizacion(fecha);
            pedido.setNumeroPedido(numeroPedido);
            new VBiblioteca(pedido);
            if(!listaItems.isEmpty()){
                gestorPedido.crearPedido(pedido);
                for(int i = 0; i < listaItems.size(); i++){
                    gestoItemPedido.crearItemPedido(listaItems.get(i));
                }
                JOptionPane.showMessageDialog(panelRegistrarPedidos, "El pedido fue registrado con exito", "Pedido", JOptionPane.INFORMATION_MESSAGE);
                limpiar();

            }else{
                JOptionPane.showMessageDialog(panelRegistrarPedidos, "Debe crear el pedido y agregar items al mismo", "Pedido", JOptionPane.INFORMATION_MESSAGE);
            }
        } catch(EntityExistsException ex) {
            JOptionPane.showMessageDialog(panelRegistrarPedidos, "Ya existe un pedido con numero de pedido: "+numeroPedido, "Pedido", JOptionPane.INFORMATION_MESSAGE);
        } catch(RollbackException ex) {
            JOptionPane.showMessageDialog(panelRegistrarPedidos, "Ya existe un pedido con numero de pedido: "+numeroPedido, "Pedido", JOptionPane.INFORMATION_MESSAGE);
        } catch(NumberFormatException ex) {
            JOptionPane.showMessageDialog(panelRegistrarPedidos, "El ISBN, cantidad y numero de pedido deben ser valores enteros", "Pedido", JOptionPane.INFORMATION_MESSAGE);
        } catch (VBiblioteca ex) {
            JOptionPane.showMessageDialog(panelRegistrarPedidos, ex.getMessage(), "Pedido", JOptionPane.ERROR_MESSAGE);
        }
    }

    public void limpiar() {
        panelRegistrarPedidos.textFieldCantidad.setText("");
        panelRegistrarPedidos.textFieldISBN.setText("");
        panelRegistrarPedidos.textFieldNumPedido.setText("");
        panelRegistrarPedidos.textFieldNumPedido.setEditable(true);
        limpiarItems();
    }
}
